<?php
/**
 * Абстрактный класс источника данных для списка
 * 
 * @author naspeh
 * @version $Id: Abstract.php 661 2008-06-16 10:38:02Z naspeh $
 */
abstract class Core_Record_Source_Abstract
{
    /**
     * Массив доступных полей
     *
     * @var array|null
     */
    private $_fields = null;
    /**
     * Проверяет поле на доступность
     *
     * @param string $name
     * @return Core_Record_Source_Abstract
     */
    public function isValidField($name)
    {
        $name = (string) $name;
        if (false == $this->getFields($name)) {
            throw new Core_Exception('fieldNotFoundInSource# ' . $name);
        }
        return $this;
    }
    /**
     * Возвращает поля(поле, если $name не null) 
     *
     * @param string $name
     * @return array|string|false
     */
    public function getFields($name = null)
    {
        if (is_null($this->_fields)) {
            $this->_fields = $this->_getFields();
        }        
        if (!is_null($name)) {
            $name = (string) $name;
            if (false !== ($key = array_search($name, $this->_fields))) {
                return $this->_fields[$key];
            }
            return false;
        }
        return $this->_fields;        
    }
    /**
     * Возвращает все стороки 
     *
     * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
     * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
     * @param int                               $count  OPTIONAL An SQL LIMIT count.
     * @param int                               $offset OPTIONAL An SQL LIMIT offset.
     * @return array
     */
    abstract public function fetchAll($where = null, $order = null, $count = null, $offset = null);
    /**
     * Возвращает список доступных полей
     * 
     * @return array
     */
    abstract protected function _getFields();
}